﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
using ProductManagement.CrystalReports;
using ProductManagement;
using ProductManagement.Forms;

namespace ProductManagement.Forms
{
    /// <summary>
    /// Form báo cáo
    /// </summary>
    public partial class ReportForm : MetroForm
    {
        #region Các biến

        /// <summary>
        /// id của báo cáo do MainForm truyền vào
        /// </summary>
        private int _rid;
        /// <summary>
        /// id của chi tiết báo cáo được chọn trong bảng 
        /// </summary>
        private int _rdid;
        /// <summary>
        /// nhiệm vụ của báo cáo do MainForm truyền vào
        /// </summary>
        private string _task;
        /// <summary>
        /// Đối tượng liên kết dữ liệu LinQ to SQL, để thao tác với cơ sở dữ liệu
        /// </summary>
        private ProductManagementClassesDataContext db = new ProductManagementClassesDataContext();
        /// <summary>
        /// Form chính gọi đến form này
        /// </summary>
        private MainForm _mainForm;

        #endregion

        #region Hàm khởi tạo

        public ReportForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Hàm khởi tạo 3 tham số
        /// </summary>
        /// <param name="reportID">ID báo cáo muốn mở chi tiết</param>
        /// <param name="reportTask">Nhiệm vụ báo cáo (nhập / xuất)</param>
        /// <param name="mainForm">MainForm gọi tới form này</param>
        public ReportForm(int reportID, string reportTask, MainForm mainForm)
        {
            _rid = reportID;
            _task = reportTask;
            _mainForm = mainForm;
            InitializeComponent();
        }

        #endregion

        #region Các phương thức khác

        /// <summary>
        /// Load dữ liệu lên datagridview
        /// </summary>
        public void LoadReportDetailDgv()
        {
            dgvReportDetail.DataSource = db.sp_GetReportDetails(_rid);
            dgvcReportDetailID.Visible = false;
            dgvcReportDetailPID.Visible = false;
            dgvcReportDetailRID.Visible = false;
            int count = (int)db.sp_GetReportDetailsCount(_rid).SingleOrDefault().dem;
            for (int i = 0; i < count; i++)
                dgvReportDetail["dgvcReportDetailNo", i].Value = i + 1;
            decimal sumPrice = (decimal)db.sp_GetReportSumPrice(_rid).SingleOrDefault().tong;
            lblSumPrice.Text = "<b>Tổng giá trị nhập / xuất: " + sumPrice.ToString("0,0") + " (VNĐ)</b>";
        }

        /// <summary>
        /// Lấy các trường ID trong bảng Report
        /// </summary>
        /// <returns></returns>
        private int[] GetReportDetailIDs()
        {
            int[] result = new int[2];
            //try
            //{
                int rowIndex = dgvReportDetail.SelectedCells[0].RowIndex;
                //Lấy id của chi tiết báo cáo
                result[0] = (int)dgvReportDetail[1, rowIndex].Value;
                //Lấy id của sản phẩm
                result[1] = (int)dgvReportDetail[2, rowIndex].Value;
            //}
            //catch (ArgumentOutOfRangeException)
            //{

            //}
            //catch (Exception e)
            //{
            //    MessageBoxEx.Show(e.ToString(), "Ngoại lệ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            //}
            return result;
        }

        /// <summary>
        /// Load báo cáo cho CrystalReport
        /// </summary>
        private void LoadReportSource()
        {
            var reportDetails = db.sp_GetCrystalReportDataSource(_rid).ToList();
            if (_task.ToLower().Contains("nhập"))
            {
                ImportReport importReport = new ImportReport();
                importReport.SetDataSource(reportDetails);
                crystalReportViewer1.ReportSource = importReport;
                crystalReportViewer1.Refresh();
            }
            else
            {
                ExportReport exportReport = new ExportReport();
                exportReport.SetDataSource(reportDetails.ToList());
                crystalReportViewer1.ReportSource = exportReport;
                crystalReportViewer1.Refresh();
            }
        }

        #endregion

        #region Xử lý sự kiện

        private void ReportForm_Load(object sender, EventArgs e)
        {
            superTabControl1.SelectedTab = stiReportDetail;
            LoadReportDetailDgv();
            LoadReportSource();
        }

        /// <summary>
        /// Sự kiện chọn tab Preview
        /// </summary>
                private void stiPreviewReport_Click(object sender, EventArgs e)
        {
            LoadReportSource();
        }

                /// <summary>
                /// Sự kiện chọn tab Sửa hóa đơn
                /// </summary>
        private void stiReportDetail_Click(object sender, EventArgs e)
        {
            LoadReportDetailDgv();
        }

        private void btnDeleteReportDetail_Click(object sender, EventArgs e)
        {
            int id = GetReportDetailIDs()[0];
            if (id != 0)
            {
                DialogResult dr = MessageBoxEx.Show("Bạn có muốn xóa chi tiết báo cáo?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dr == DialogResult.Yes)
                {
                    db.sp_DeleteReportDetail(id);
                    decimal sumPrice = (decimal)db.sp_GetReportSumPrice(_rid).SingleOrDefault().tong;
                    db.sp_UpdateReportSumPrice(_rid, sumPrice);
                    LoadReportDetailDgv();
                }
                db.SubmitChanges();
            }
        }

        private void ReportForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            _mainForm.ResetDgvAllReport();
        }

        private void btnEditReportDetail_Click(object sender, EventArgs e)
        {
            int productID = GetReportDetailIDs()[1];
            EditReportDetail editReportDetailForm = new EditReportDetail(_rdid, _rid, this);
            editReportDetailForm.ShowDialog();
        }

        private void btnAddReportDetail_Click(object sender, EventArgs e)
        {
            AddReportDetailForm addReportDetailForm = new AddReportDetailForm(_rid, this);
            addReportDetailForm.ShowDialog();
        }

        private void dgvReportDetail_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            int rowIndex = e.RowIndex;
            if (rowIndex >= 0)
            {
                _rdid = (int)dgvReportDetail["dgvcReportDetailID", rowIndex].Value;
            }
        }

        #endregion
    }
}
